نحوه دوباره نویسی لینک (url rewrite) در htaccess


شاید در ذهن خیلی از برنامه نویسان وب و مدیران سایت ها، این سوال وجود داشته باشد که آیا باید حتما از لینک های استاتیک استفاده شود؟ پاسخ به این پرسش بستگی زیادی به هدف و میزان تسلط و آشنایی شما با برنامه ای است که از آن برای مدیریت سایت خود استفاده می کنید، دلایلی برای استفاده از لینک های استاتیک ارائه می شود از جمله اینکه به لحاظ حفظ امنیت این گونه لینک ها از ضریب اطمینان بالاتری برخوردارند، چرا که لینک های داینامیک معمولا ساختار مشخصی دارند و این ساختار در معرض دید کاربران است، اما با دوباره نویسی آدرس ها، ساختار لینک ها تا حدود بسیار زیادی پیچیده و نامفهوم می شود، دلیل دیگر کوتاه شدن لینک و حذف علامت های ?، & و = از آن است، البته پیش تر تصور بر این بود که موتورهای جستجو قادر به ایندکس صفحات داینامیک نیستند که البته در حال حاضر این تصور کاملا اشتباه است، تمام موتورهای جستجوی معروف به خوبی لینک های داینامیک را ایندکس می کنند، منتها لینک های استاتیک به دلیل کوتاه تر بودن و حذف موارد زائد، توصیه شده اند، مزیت بعدی که گفته می شود این است که لینک های استاتیک راحت تر به خاطر سپرده می شوند و در موتور های جستجو، آمار کلیک بهتری کسب می کنند، البته قسمت اول این گفته بستگی زیادی به تعداد کاراکتر یک لینک دارد (هر چه کوتاه تر، بهتر) و قسمت دوم نیز بین یک لینک داینامیک با پارامترهای مناسب و کوتاه و یک لینک استاتیک مشابه، آنچنان فرق محسوسی نیست؛ حال با این تفاسیر کدام روش را انتخاب کنیم؟ همانطور که گفتیم این امر بستگی زیادی به هدف شما دارد، اگر به فرض رقابت با سایرین از لحاظ جذب بازدید کننده برایتان اهمیت زیادی دارد و سایر اصول مربوط به بهینه سازی را نیز رعایت کرده اید، توصیه می کنیم این یک مورد را هم فرا بگیرید و با رعایت اصول و جوانب فنی، از آن استفاده نمائید، اما اگر به طور مثال یک سایت اداری یا شخصی را مدیریت می کنید و جوانب امنیتی پایگاه داده را هم رعایت کرده اید، دوباره نویسی لینک ها چندان ضرورتی نخواهد داشت، کما اینکه بسیاری از سایت های موفق هستند که از لینک های داینامیک استفاده می کنند و مشکل خاصی نیز برای آنها از این لحاظ پیش نمی آید، بنابراین همه چیز بستگی به خودتان دارد.

نکاتی که در دوباره نویسی  لینک (url rewrite) باید رعایت کنیم


باید یادآور شویم که دوباره نویسی لینک های داینامیک (url rewrite) کار حساسی است و باید با دقت و تسلط کامل انجام شود، اشتباه در این خصوص ممکن است باعث بروز مشکلاتی از جمله ایجاد مطالب تکراری (duplicate content) و یا موجب اختلال در عملکرد سایت شود، البته خوشبختانه تغییرات فایل htaccess به سرعت قابل بازگشت به حالت سابق است، چون سرور در هربار پردازش اطلاعات، آن را به طور مجدد فرا می خواند؛ اما با این حال این کار باید با در نظر گرفتن تمام احتمالات و آزمایش های قبلی صورت گیرد.

 

آشنایی با mod_rewrite در سرور Apache


دوباره نویسی یا  rewrite لینک ها در سرورهای لینوکسی Apache با ماژولی به نام mod_rewrite انجام می شود، این ماژول تقریبا یکی از محبوب ترین، قدرتمند ترین و پرکاربردی ترین ها در این نوع سرورها محسوب می شود، قدرت mod_rewrite در حدی است که هر نوع دستکاری در ساختار لینک های سایت توسط آن میسر می شود، اصول کار این ماژول بر اساس عبارات با قاعده یا Regular Expressions است که قوانین خاصی در آن با این روش تعریف می شود (RewriteRule)، اگرچه گستره قواعد و خاصیت های این ماژول بسیار زیاد است، اما برای استفاده های معمول، می توان با فراگیری چند تکنیک ساده، نیازهای خود را برطرف نمود؛ این قابلیت در بیشتر سرورهای Apache به صورت پیش فرض فعال است، اما اگر هاست شما از آن پشتیبانی نمی کند، می توانید موضوع را با پشتیبان خود مطرح کنید، نصب و استفاده از این ماژول بسیار آسان و پرکاربرد است و معمولا هاست ها آن را فعال می کنند.

mod_rewrite در سرور ویندوز


در سرورهای ویندوز، ماژول mod_rewrite وجود ندارد، ولی با پلاگین های دیگری می توان عملیات دوباره نویسی لینک ها را شبیه سازی کرد، به فرض پلاگینی با نام  ISAPI_Rewrite در سرورهای ویندوز می تواند رهگشا باشد.

 

نحوه دوباره نویسی لینک (url rewrite)


برای دوباره نویسی آدرس های وب، قبل از هر چیز به یک فایل متنی ساده به نام htaccess. (به همین صورت، با پسوند htaccess و بدون نام) در ریشه سایت خود (پوشه www یا public_html) نیاز خواهیم داشت، اگر فایل htaccess. به طور پیش فرض در سرور شما وجود ندارد، می توانید به راحتی آن را ایجاد کنید، دقت کنید که نقل و انتقال این فایل به سرور باید به صورت ASCII انجام شود، نه باینری (BINARY)، سپس مطابق نیاز خود باید دستوراتی که در ادامه خواهیم گفت را در آن درج و تنظیم نمائید.
اجازه دهید آموزش را با یک مثال ادامه دهیم، فرض کنید آدرس زیر را می خواهیم دوباره نویسی کنیم.

http://yoursite.com/index.php?q=home

هدف ما این است که آدرس بالا را به صورت زیر درآوریم، یعنی با وارد کردن آدرس زیر، در واقع سرور پارامترهای لینک بالا را در پس زمینه و به طور پنهانی دریافت کند.

http://yoursite.com/home

بدین منظور ابتدا ماژول mod_rewrite را روشن می کنیم، سپس از قوانین آن استفاده کرده و با عبارات با قاعده (در ادامه بیشتر خواهیم گفت)، یک قانون (RewriteRule) می نویسیم تا وقتی سرور لینک درخواستی را با آن مطابقت داد، قانون ما عمل کرده و لینک اصلی در پس زمینه دریافت شود.

RewriteEngine On
RewriteRule ^home /index.php?q=home [NC,L]

با کپی عبارت بالا در فایل htaccess. و قرار دادن آن در ریشه سایت، سرور آدرس دریافتی را بررسی و اگر با قانون تعریف شده مطابقت داشته باشد، لینک اصلی را تعریف می کند، اگر این کار را درست انجام ندهید، معمولا خطای داخلی سرور با کد 500 یا همان HTTP Error 500 Internal server error را دریافت خواهید کرد.
قانون بالا از دو قسمت تشکیل شده است، در بخش اول شرایط لینک دریافتی بررسی می شود، اگر با الگو (pattern) مطابقت داشت، لینک استاتیک دریافتی تبدیل به لینک داینامیک قسمت دوم (substitution یا جانشین) می شود، در واقع اگر در لینک استاتیک عبارت home وجود داشته باشد، سرور آن را به صورت  index.php?q=home شناسایی می کند؛ علامت های شبیه ^ معنی خاصی دارند که به آنها در اصطلاح عبارات با قاعده یا Regular Expressions می گویند، حروف [NC,L] نیز معانی خاصی در زمینه نحوه پردازش قوانین دارند و با این روش نوع اعمال قوانین را به سرور تفهیم می کنیم، به طور مثال NC به معنی case-insensitive یا حساس نبودن به حروف بزرگ و کوچک است، یا حرف L به معنی Last و آخرین است، یعنی اگر این قانون اجرا شد، بقیه قوانین بعد از آن نادیده گرفته می شوند، به این حروف در اصطلاح نشانه ها یا Flags می گویند.

 

توضیح مختصر عبارات با قاعده در htaccess


برای کاربرد صحیح قوانین دوباره نویسی، باید آشنایی مختصری با عبارات با قاعده داشته باشیم، در زیر چند عبارت پرکاربرد همراه معنی آن ذکر شده است.
Anchors
یا لنگرها: لنگرها شروع و پایان یک رشته را مشخص می کنند، به فرض الگوی زیر، به معنی کلیه لینک هایی است که بعد از آدرس سایت، قسمت دوم آنها، با اعداد (0 تا 9) شروع می شود.

^([0-9]+)/

الگوی بالا با لینک فرضی زیر مطابق خواهد بود.

http://www.yoursite.com/143231/

علامت ^ هر آنچه پیش از آن آمده باشد را شامل می شود، همچنین است علامت $ که به معنی پایان یک رشته است.
دسته بندی ها یا Character Classes: نوع دیگر از حروف با قاعده با علامت های w ،s ،W ، d و... (حساس به حروف بزرگ یا کوچک) تعریف می شوند، به فرض علامت d\ با اعداد (0-9) مطابقت دارد، یا w\ به معنی حروف و اعداد انگلیسی است، همچنین W\ شامل همه چیز به جزء حروف و اعداد می شود، s\ (با حروف کوچک) نیز به معنی فضای خالی است.
تاکیدات یا Assertions: یک نوع دیگر از عبارات با قاعده، تاکیدات هستند، به اینصورت که اگر به فرض لینک دریافتی را برای وجود حرف a بررسی کرده و در عین حال بخواهیم بعد از حرف a کلمه فرضی book نیز نیامده باشد، خواهیم نوشت:

[^\S]*a(?!book)[^\S]*

قسمت مربوط به حرف S (با حروف بزرگ) در اینجا به معنی عدم فاصله خالی در عبارت است، سپس وجود حرف a بررسی می شود و بعد از آن، عدم وجود کلمه book و سپس نبودن فضای خالی، اگر لینک ارسالی از این الگو پیروی کند، قسمت دوم قانون اجرا می شود.
گروه و حدود: یکی از پر کاربرد ترین عبارات با قاعده گروه ها و حدود هستند، به فرض اگر بخواهیم بررسی کنیم که آیا در رشته ای، عباراتی بین اعداد 0 تا 9 یا حروف a تا z قرار دارد یا خیر، خواهیم نوشت:

[^A-Za-z0-9]

علامت یا (|): علامت یا (|) نیز در عبارات با قاعده کاربرد زیادی دارد، به فرض عبارت زیر به معنی وجود حروف web یا goo در رشته ارسالی است.

(web|goo)

در واقع عبارات با قاعده تنوع زیادی دارند و یادگیری تمام آنها در این مطلب نمی گنجد، در اینجا هدف فقط، آشنایی نسبی شما با عملکرد و منظور از به کارگیری آنها است.

چند مثال کاربردی برای دوباره نویسی آدرس های وب


به دلیل پیچیده به نظر رسیدن موضوع در نگاه اول، شاید بهترین روش برای یادگیری نحوه دوباره نویسی لینک ها در htaccess، استفاده از مثال های کاربردی باشد، با این شیوه هم با نحوه اعمال دستورات آشنا خواهیم شد و هم می توانیم از مثال ها، در برنامه خود استفاده کنیم.

 

- انتقال آدرس از index.html به index.php

 

RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html
RewriteRule ^index\.html$ http://yoursite.com/index.php [R=301,L]

RewriteCond در واقع نقش دستورات شرطی را در mod_rewrite بازی می کند، همانطور که ملاحظه می کنید، پارامتر THE_REQUEST نیز در این ماژول قابل دسترسی است، این پارامتر همان قسمت بعد از آدرس اصلی سایت، در یک لینک درخواستی است (در اینجا index.html)، کد بالا به این نحو تفسیر می شود:
اگر در لینک درخواستی، حروف A تا Z یا اعداد 0 تا 9 وجود داشت و برابر با index.html بود، قانون بعدی اجرا شده و با R=301 که به معنی ریدایرکت همیشگی یا (Moved Permanently) است، کاربر به آدرس http://yoursite.com/index.php منتقل شود.
علامت $ یک نوع لنگر و به معنی پایان یک عبارت است (برعکس ^ و در انتهای عبارت).

- دوباره نویسی آدرس داینامیک با یک پارامتر متنی


در این مثال یک آدرس داینامیک را که یک متغیر متنی دارد، دوباره نویسی می کنیم.

RewriteEngine On
RewriteRule ^category/([^/]+) /?category=$1 [NC,L]

در این مثال لینک فرضی http//yoursite.com/category/learn در سرور به صورت http//yoursite.com/?category=learn تبدیل می شود، همانطور که ملاحظه می کنید، قسمت دوم الگو (کلمه learn) به صورت 1$ برای حالت داینامیک تنظیم می شود که این یک قانون تعریف شده در mod_rewrite برای تعیین متغیر ها و مقادیر آنها است.

- دوباره نویسی آدرس داینامیک با یک پارامتر عددی


در این مثال یک آدرس داینامیک را که یک متغیر عددی دارد، دوباره نویسی می کنیم.

RewriteEngine On
RewriteRule ^category/([0-9]+) /?category=$1 [NC,L]

به فرض لینک http//yoursite.com/category/5 به صورت http//yoursite.com/?category=5 دریافت می شود.

- دوباره نویسی یک آدرس داینامیک با دو پارامتر متنی و عددی


در این مثال یک آدرس داینامیک را که دو متغیر متنی و عددی دارد، دوباره نویسی می کنیم.

RewriteEngine On
RewriteRule ^category/([0-9]+)/([^/]+) /?category=$1&title=$2 [NC,L]

دستور بالا به فرض لینک http//yoursite.com/category/5/learn-web را به صورت http//yoursite.com/?category=5&title=learn-web دوباره نویسی خواهد کرد.

- انتقال از آدرس های غیر اصلی به آدرس اصلی


در مثال زیر، دستوری را تنظیم کرده ایم که با آن، اگر کاربر در لینک ورودی عبارت www را تایپ نکرده باشد، او را به آدرس با www هدایت کنیم.

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.yoursite\.com$ [NC]
RewriteRule .? http://www.yoursite.com%{REQUEST_URI} [R=301,L]

دستورات HTTP_HOST، REQUEST_URI مربوط به سربرگ های HTTP و سرور Apache هستند، نمونه آنها را در php نیز دیده ایم، به فرض HTTP_HOST در واقع آدرس اصلی سایت است، یا REQUEST_URI قسمت بعد از آدرس سایت است که توسط کاربر درخواست می شود.
همانطور که گفتیم، دوباره نویسی لینک ها باید با دقت بالا انجام شود، اشتباه در نحوه چینش قانون ها، مخصوصا در مورد قوانین مشابه، ممکن است موجب بروز اختلال در عملکرد سایت شده، یا سبب بروز مشکل مطالب تکراری (duplicate content) گردد، بهتر است در این خصوص بر تکنیک ریدایرکت 301 (Moved Permanently) نیز تسلط کافی داشته باشید و قبل از اعمال تغییرات در ساختار لینک های سایت، حتما همه ی جوانب را تست کنید.

 


نظرات شما عزیزان:

نام :
آدرس ایمیل:
وب سایت/بلاگ :
متن پیام:
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

 

 

 

عکس شما

آپلود عکس دلخواه:






موضوعات مرتبط: بهنه سازي ، ،
برچسب‌ها:

تاريخ : جمعه 6 فروردين 1395برچسب:, | 17:30 | نویسنده : محمد |

.: Weblog Themes By SlideTheme :.


  • سحر دانلود